package com.example.time_bank_demo.service;


import com.example.time_bank_demo.dao.TbUserDao;
import com.example.time_bank_demo.exception.TimeBankException;
import com.example.time_bank_demo.model.TbUser;
import com.example.time_bank_demo.params.UserCreateParams;
import com.example.time_bank_demo.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class RegisterServiceImpl implements RegisterService {

    //alt + enter  可以快速互换 构造方法  快捷导航  alt+ enter  +enter


    // 注入类型  两种注入类型  我怎么知道我注入的这个类 是我要的这个类
    //什么都不写的情况下 spring 可以获取到你的属性的类型  通过类型去注入   如果说有多个实现类 通过接口或者父类的方式注入 会 报错
    // 通过@Qualifier("beanName")  通过beanName去注入  by name  类名  registerServiceImpl


    //bean 豆子  实例  new 出来的对象  spring 容器里面的对象
    //容器 豆荚 里面装了很多豆子
    //spring 容器 里面装了很多bean
    private final TbUserDao tbUserDao;

    private final CodeCheckService codeCheckService;

    public RegisterServiceImpl(TbUserDao tbUserDao, CodeCheckService codeCheckService) {
        this.tbUserDao = tbUserDao;

        this.codeCheckService = codeCheckService;

        // 所有子类 一定尊从 父类的特性 例如  一个接口的实现类 一定要实现接口的所有方法
        CodeCheckService codeCheckService123 = new CodeCheckServiceImpl();
    }


    @Override
    public UserVo register(UserCreateParams createParams) throws TimeBankException {
        //校验手机号 和验证码
        //手机号和验证码的校验 依赖于其他服务 但是我们在这里可以先不实现这些服务 暂时留下接口 即可
        if (!codeCheckService.checkCode(createParams.getPhone(), createParams.getCode())) {
            log.info("验证码错误");
            throw new TimeBankException(4,"验证码错误");
        }
        //其他校验方式 就不一一列举了  有些依赖其他组件 暂时无法实现 例如  邀请码是否正确  身份证+姓名 其余可以自己实现 但是先不实现

        //插入数据库
        TbUser tbUser = tbUserDao.insertUser(createParams);

        //TODO 发送短信通知  暂时无接口


        return new UserVo(tbUser);
    }
}
